import 'package:flutter/painting.dart';

/// **TokenType**：词法单元的分类。
///
/// 在语法高亮中，不同类型的 token 会映射到不同的 [TextStyle]。
///
/// - [keyword]：关键字（如 `class`, `if`, `return`）
/// - [string]：字符串字面量
/// - [comment]：注释（单行/多行）
/// - [number]：数字字面量
/// - [identifier]：标识符（变量名、函数名等）
/// - [punctuation]：标点符号（如 `;`, `,`, `{`, `}`）
/// - [operator_]：运算符（如 `+`, `-`, `==`, `&&`）
/// - [whitespace]：空白字符（空格、Tab 等）
/// - [other]：未分类或兜底类型
enum TokenType {
  keyword,
  string,
  comment,
  number,
  identifier,
  punctuation,
  operator_,
  whitespace,
  other,
}

/// **Token**：
///
/// - 表示源代码中一个经过分类的词法单元。
/// - 保存其所在行的起止列索引和 [TokenType]。
///
/// ### 字段
/// - [start]：起始位置（包含，基于行内的列号）；
/// - [end]：结束位置（不包含）；
/// - [type]：token 的类别。
///
/// ### 属性
/// - [length]：该 token 的长度（`end - start`）。
class Token {
  /// 起始列索引（包含）。
  final int start;

  /// 结束列索引（不包含）。
  final int end;

  /// Token 的类型。
  final TokenType type;

  const Token(this.start, this.end, this.type);

  /// Token 的字符长度。
  int get length => end - start;
}

/// **StyledRun**：
///
/// - 用于渲染时的“着色片段”；
/// - 和 [Token] 类似，但直接绑定了具体的 [TextStyle]；
/// - 通常在高亮阶段由 `TokenType -> TextStyle` 的映射生成。
///
/// ### 字段
/// - [start]：起始列索引（包含）；
/// - [end]：结束列索引（不包含）；
/// - [style]：应用的 [TextStyle]。
class StyledRun {
  /// 起始列索引（包含）。
  final int start;

  /// 结束列索引（不包含）。
  final int end;

  /// 渲染所用的样式。
  final TextStyle style;

  const StyledRun(this.start, this.end, this.style);
}
